package com.leyou.page.service;

import com.leyou.item.client.ItemClient;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import com.leyou.item.pojo.Brand;
import com.leyou.item.pojo.Category;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class PageService {
    @Autowired
    private ItemClient itemClient;
    @Autowired
    private SpringTemplateEngine templateEngine;

    @Value("${ly.static.itemDir}")
    private String itemDir;

    public Map<String, Object> getDetailData(Long id) {

        //1.根据spuId查询Spu信息
        SpuDTO spuDTO = itemClient.findSpuById(id);
        //2.查询所有分类
        List<Category> categoryList = itemClient.findCategoriesByIds(
                Arrays.asList(spuDTO.getCid1(), spuDTO.getCid2(), spuDTO.getCid3()));
        //3.查询品牌
        Brand brand = itemClient.findBrandById(spuDTO.getBrandId());
        //4.查询规格参数组（包含每个组的参数列表）
        List<SpecGroupDTO> specGroupDTOS = itemClient.findSpecGroupDTOsByCid(spuDTO.getCid3());

        //5.把数据封装成Map集合
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("categories",categoryList);
        resultMap.put("brand",brand);
        resultMap.put("spuName",spuDTO.getName());
        resultMap.put("subTitle",spuDTO.getSubTitle());
        resultMap.put("detail",spuDTO.getSpuDetail());
        resultMap.put("skus",spuDTO.getSkus());
        resultMap.put("specs",specGroupDTOS);
        return resultMap;
    }

    /**
     * 为每个商品生产详情静态页
     */
    public void createStaticPage(Long id){
        //1. 创建Context对象（读取动态数据）
        Context context = new Context();
        //填充动态数据
        context.setVariables(getDetailData(id));

        //2.制作一个模板页面item.html（ok）
        String tempName = "item.html";

        //3.使用引擎对象生成静态页（静态+动态=页面）
        /**
         * 参数一：模板文件名 注意：模板引擎对象自动到前缀目录（templates）去读页面
         * 参数二：Context对象
         * 参数三：字符串输出流，指定文件生成路径
         */
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new File( itemDir , id+".html"));
            templateEngine.process(tempName,context,writer);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            //注意：必须关闭输出流，否则无法删除文件
            writer.close();
        }

    }

    public void deleteStaticPage(Long id) {
        //1.读取静态页文件
        File file = new File(itemDir,id+".html");

        //2.如果存在，则删除
        if(file.exists()){
            file.delete();
        }
    }
}
